home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / lib / flyEngine / flyDLL.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-11-23  |  6.4 KB  |  330 lines

  1. #include "../Fly3D.h"
  2.  
  3. flydllgroup::flydllgroup()
  4.     dll=0; 
  5.     ndll=0;
  6.     cd=0;
  7.     ncd=0;
  8. };
  9.  
  10. flydllgroup::~flydllgroup() 
  11. {
  12.     reset();
  13. }
  14.  
  15. void flydllgroup::reset()
  16. {
  17.     if (cd)
  18.         delete cd;
  19.     cd=0; ncd=0;
  20.  
  21.     if (dll) 
  22.     {
  23.         int i;
  24.         for( i=0;i<ndll;i++ ) 
  25.         {
  26.             FreeLibrary(dll[i]->hdll);
  27.             delete dll[i];
  28.         }
  29.         delete dll;
  30.         dll=0;
  31.         ndll=0;
  32.     }
  33. }
  34.  
  35. void flydllgroup::load_default_param(bsp_object *o,char *sec,fly_pak *file)
  36. {
  37.     o->pos.null();
  38.     o->rot.null();
  39.     o->vel.null();
  40.     o->force.null();
  41.     o->bump=0.0f;
  42.     o->friction=0.0f;
  43.     o->mass=1.0f;
  44.     o->radius=1.0f;
  45.     o->life=1;
  46.     o->col_flag=0;
  47.     o->active=0;
  48.     o->align_z(vector(0,0,1));
  49.  
  50.     o->load_default_params(file,sec);
  51.  
  52.     o->rotate(o->rot);
  53.  
  54.     o->next_obj=flyengine->stock_obj0;
  55.     flyengine->stock_obj0=o;
  56.  
  57.     int i;
  58.     for( i=0;i<o->active;i++ )
  59.         flyengine->activate(o->clone());
  60. }
  61.  
  62. void flydllgroup::load_all_classes(fly_pak *file)
  63. {
  64.     for( int d=0;d<ndll;d++ )
  65.         load_classes(d,file);
  66. }
  67.  
  68. void flydllgroup::load_classes(int d,fly_pak *file)
  69. {
  70.     if (d>=0 && d<ndll)
  71.     if (dll[d]->num_classes!=0 && dll[d]->get_class_desc!=0) 
  72.     {
  73.     int i,j;
  74.     dll[d]->nclasses=dll[d]->num_classes();
  75.     class_desc **tmp=new class_desc *[ncd+dll[d]->nclasses];
  76.     if (cd) 
  77.         {
  78.         memcpy(tmp,cd,sizeof(class_desc *)*ncd);
  79.         delete cd;
  80.         }
  81.     cd=tmp;
  82.     for( i=0;i<dll[d]->nclasses;i++ )
  83.         cd[i+ncd]=dll[d]->get_class_desc(i);
  84.  
  85.     if (file)
  86.     {
  87.     bsp_object *o;
  88.     char str[256],ret[256];
  89.     for( i=0;i<dll[d]->nclasses;i++ )
  90.         {
  91.         j=0;
  92.         while(1)
  93.             {
  94.             sprintf(str,"%s%i",cd[i+ncd]->get_name(),j++);
  95. //            GetPrivateProfileString(str,"longname","",ret,255,file);
  96.             file->get_profile_string(str,"longname",ret);
  97.             if (ret[0]==0) break;
  98.             o=(bsp_object *)cd[i+ncd]->create();
  99.             strcpy(o->name,str);
  100.             strcpy(o->long_name,ret);
  101.             load_default_param(o,str,file);
  102.             }
  103.         }
  104.     }
  105.     
  106.     ncd+=dll[d]->nclasses;
  107.     }    
  108. }
  109.  
  110. int flydllgroup::send_message(int msg,int param,void *data)
  111. {
  112.     int i;
  113.     for( i=0;i<ndll;i++ )
  114.         if (dll[i]->fly_message(msg,param,data)==0)
  115.             return 0;
  116.     return 1;
  117. }
  118.  
  119. int flydllgroup::add_dll(char *filename)
  120. {
  121.     char file[256];
  122.     sprintf(file,"%splugin\\%s",flyengine->flysdkpath,filename);
  123.     HINSTANCE d=LoadLibrary(file);
  124.     if (d)
  125.     {
  126.         if (GetProcAddress(d,"num_classes")==0 ||
  127.             GetProcAddress(d,"get_class_desc")==0 ||
  128.             GetProcAddress(d,"fly_message")==0)
  129.             return -1;
  130.  
  131.         flydll **tmp=new flydll *[ndll+1];
  132.         memcpy(tmp,dll,sizeof(flydll *)*ndll);
  133.         if (dll) delete dll;
  134.         dll=tmp;
  135.         
  136.         dll[ndll]=new flydll;
  137.         dll[ndll]->hdll=d;
  138.         strcpy(dll[ndll]->dll_filename,filename);
  139.         dll[ndll]->num_classes=(int (*)())GetProcAddress(d,"num_classes");
  140.         dll[ndll]->get_class_desc=(class_desc *(*)(int i))GetProcAddress(d,"get_class_desc");
  141.         dll[ndll]->fly_message=(int (*)(int msg,int param,void *data))GetProcAddress(d,"fly_message");
  142.         dll[ndll]->nclasses=0;
  143.  
  144.         return ndll++;
  145.     }
  146.     return -1;
  147. }
  148.  
  149. int flydllgroup::delete_dll(char *filename)
  150. {
  151.     int i,j=0,k;
  152.     
  153.     for( i=0;i<ndll;i++ )
  154.         if (!strcmp(filename,dll[i]->dll_filename))
  155.             break;
  156.         else j+=dll[i]->nclasses;
  157.     if (i==ndll)
  158.         return 0;
  159.     
  160.     for( k=j;k<j+dll[i]->nclasses;k++ )
  161.     {
  162.         char *name=cd[k]->get_name();
  163.         int len=strlen(name);
  164.  
  165.         bsp_object *o=flyengine->stock_obj0;
  166.         while(o)
  167.         {
  168.             if (!strncmp(o->name,name,len))
  169.             {
  170.                 bsp_object *tmp=o;
  171.                 o=(bsp_object *)o->next_obj;
  172.                 delete_class(tmp);
  173.             }
  174.             else o=(bsp_object *)o->next_obj;
  175.         }
  176.     }
  177.  
  178.     memcpy(&cd[j],&cd[j+dll[i]->nclasses],(ncd-(j+dll[i]->nclasses))*sizeof(class_desc *));
  179.     ncd-=dll[i]->nclasses;
  180.     delete dll[i];
  181.     memcpy(&dll[i],&dll[i+1],(ndll-(i+1))*sizeof(flydll *));
  182.     ndll--;
  183.     return 1;
  184. }
  185.  
  186. void flydllgroup::delete_references(bsp_object *o)
  187. {
  188.     param_desc pd;
  189.     int n,k;
  190.     bsp_object *obj;
  191.     
  192.     obj=flyengine->active_obj0;
  193.     while(obj)
  194.     {
  195.         n=obj->get_param_desc(0,0);
  196.         for( k=0;k<n;k++ )
  197.             {
  198.             obj->get_param_desc(k,&pd);
  199.             if (pd.type>255 || pd.type<-255 || pd.type=='d' || pd.type=='o')
  200.                 if ((*((bsp_object **)pd.data))==o)
  201.                     *((bsp_object **)pd.data)=0;
  202.             }
  203.         
  204.         obj=(bsp_object *)obj->next_obj;
  205.     }
  206.  
  207.     obj=flyengine->stock_obj0;
  208.     while(obj)
  209.     {
  210.         n=obj->get_param_desc(0,0);
  211.         for( k=0;k<n;k++ )
  212.             {
  213.             obj->get_param_desc(k,&pd);
  214.             if (pd.type>255 || pd.type<-255 || pd.type=='d' || pd.type=='o')
  215.                 if ((*((bsp_object **)pd.data))==o)
  216.                     *((bsp_object **)pd.data)=0;
  217.             }
  218.         
  219.         obj=(bsp_object *)obj->next_obj;
  220.     }
  221. }
  222.  
  223. void flydllgroup::delete_class(bsp_object *o)
  224. {
  225.     bsp_object **op=0;
  226.  
  227.     op=&flyengine->active_obj0;
  228.     while( *op )
  229.     {
  230.         bsp_object *tmp=*op;
  231.         if (tmp->source==o)
  232.         {
  233.             if (flyengine->cam==tmp)
  234.                 flyengine->cam=0;
  235.             if (flyengine->player==tmp)
  236.                 flyengine->player=0;
  237.             *op=(bsp_object *)tmp->next_obj;
  238.             tmp->next_obj=0;
  239.             delete_references(tmp);
  240.             tmp->remove_from_bsp();
  241.             delete tmp;
  242.         }
  243.         else 
  244.             op=(bsp_object **)&tmp->next_obj;
  245.     }
  246.  
  247.     op=&flyengine->stock_obj0;
  248.     while( *op )
  249.     {
  250.         bsp_object *tmp=*op;
  251.         if (tmp==o)
  252.         {
  253.             if (flyengine->cam==tmp)
  254.                 flyengine->cam=0;
  255.             if (flyengine->player==tmp)
  256.                 flyengine->player=0;
  257.             *op=(bsp_object *)tmp->next_obj;
  258.             delete_references(tmp);
  259.             tmp->next_obj=0;
  260.             delete tmp;
  261.         }
  262.         else 
  263.             op=(bsp_object **)&tmp->next_obj;
  264.     }
  265. }
  266.  
  267. bsp_object *flydllgroup::add_class(char *name)
  268. {
  269.     int i;
  270.     bsp_object *o=0;
  271.     for( i=0;i<ncd;i++ )
  272.         if (!stricmp(name,cd[i]->get_name()))
  273.             break;
  274.     if (i<ncd)
  275.     {
  276.         o=(bsp_object *)cd[i]->create();
  277.         o->next_obj=flyengine->stock_obj0;
  278.         flyengine->stock_obj0=o;
  279.         o->pos.null();
  280.         o->rot.null();
  281.         o->vel.null();
  282.         o->force.null();
  283.         o->align_z(vector(0,0,1));
  284.         o->force.null();
  285.         o->col_flag=0;
  286.         o->bump=0;
  287.         o->friction=0;
  288.         o->life=0;
  289.         o->mass=0.0f;
  290.         o->radius=0.0;
  291.         o->active=0;
  292.         int i,j,len;
  293.         param_desc pd;
  294.         i=o->get_param_desc(0,0);
  295.         for( j=0;j<i;j++ )
  296.         {
  297.             o->get_param_desc(j,&pd);
  298.             len=4;
  299.             if (pd.type=='v' || pd.type=='c')
  300.                 len=12;
  301.             else if (pd.type=='s')
  302.                 len=1;
  303.             if (pd.type=='p')
  304.                 *((int *)pd.data)=-1;
  305.             else memset(pd.data,0,len);
  306.         }
  307.     }
  308.     return o;
  309. }
  310.  
  311. void flydllgroup::move_dll(char *filename,int newrelpos)
  312. {
  313.     int i,j,k;
  314.     for( i=0;i<ndll;i++ )
  315.         if (!strcmp(filename,dll[i]->dll_filename))
  316.             break;
  317.     if (i<ndll)
  318.     {
  319.         flydll *d=dll[i];
  320.         dll[i]=dll[i+newrelpos];
  321.         dll[i+newrelpos]=d;
  322.  
  323.         k=0;
  324.         for( i=0;i<ndll;i++ )
  325.             for( j=0;j<dll[i]->nclasses;j++ )
  326.                 cd[k++]=dll[i]->get_class_desc(j);
  327.     }
  328. }
  329.